/**
 * Thinking in java 
 *  2018/08/01
 */
package com.dzb.nio;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;

/**
 * @author dzb
 * @date 2018年8月15日 下午12:26:28
 * @description  
 * @version 1.0.0
 */
public class NioSocketProcessor implements Runnable {
	
	SocketChannel clientSocketChannel;
	
	/**
	 * 
	 */
	public NioSocketProcessor(SocketChannel socketChannel) {
		this.clientSocketChannel =socketChannel;
	}
	

	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		
		try {
			// 申请一个缓冲区
			ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
			// 将数据读到缓冲区
			clientSocketChannel.read(byteBuffer);
			// 读完数据后，将缓冲区设置为读模式
			byteBuffer.flip();
			// 将缓冲区数据读出来并转化为字符串
			String request = new String(byteBuffer.array());
			System.out.println("收到新数据，当前线程数：" + new NioServer().threadPoolExecutor.getActiveCount() + "，请求内容：" + request);
			// 清除缓冲区
			byteBuffer.clear();

			// 给客户端返回一串内容
			String response = "succes this time is " + System.currentTimeMillis();
			// 放入一个缓冲区
			ByteBuffer wrap = ByteBuffer.wrap(response.getBytes());
			// 使用通道，将数据响应给客户端
			clientSocketChannel.write(wrap);
			// 清除缓冲区
			wrap.clear();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				clientSocketChannel.configureBlocking(false);
				// 处理完一次请求
				// 继续在socket连接上，增加查询器（复用上面已有的查询器）
				// 查询条件和上面的一致是：OP_READ 有数据传输
				clientSocketChannel.register(new NioServer().selector, SelectionKey.OP_READ);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		

	}

}
